package data.list;

import java.util.HashMap;

import org.jdom.Element;

import data.Dataexception;
import data.item.Item;

/**
 * Die Datenlist ist die Basis fuer alle anderen im Spiel vorhandenen Listen
 * (z.B. Attribute, Fertigkeiten, Talente)
 * Sie enthaelt eine Hashmap in der alle Daten gespeichert werden sowie
 * Methoden um auf sie zuzugreifen
 * 
 * @author daishy
 * @date 13.03.2008 11:42:22
 *
 * @param <T>
 */
public abstract class Datalist<T extends Item> extends data.Data
{	
	/**
	 * Die Daten
	 */
	protected HashMap<String, T> data;
	
	
	/**
	 * CTor. Erstellt die HashMap
	 */
	public Datalist(String id)
	{
		super(id);
		this.data = new HashMap<String, T>();
	}
	
	/**
	 * Abstrakte Methoden zum einlesen eines XML-Elements
	 * @param elem Das Element des XML-Baums
	 * @throws Dataexception
	 */
	public abstract void processXML(Element elem) throws Dataexception;
	
	
	/**
	 * Die Methode fuegt das uebergeben Item in die interne Liste
	 * hinzu. Sollte das Item schon in der Liste vorhanden sein (sprich
	 * die ID) wird eine Exception geworfen
	 * 
	 * @param item
	 * @throws Dataexception
	 */
	protected void addItem(T item) throws Dataexception
	{
		if(!data.containsKey(item.getID()))
			throw new Dataexception("Item already in this list");
		
		data.put(item.getID(), item);		
	}
	
	
	/**
	 * Die Methode liefert eine Stringdarstellung der internen Liste.
	 * Diese Methoden ist hauptsaechlich fuer Debuggingausgaben
	 */
	public String toString()
	{
		StringBuilder sb = new StringBuilder();
		for(Object o : this.data.values())
			sb.append(o.toString() + "\n");
		return sb.toString();
	}
}
